#include "main.h"
#include "wave_gen.h"
#include "dac.h"
#include "tim.h"

static const unsigned int N_sine_table = 100;
uint16_t sine_table[N_sine_table] = \
{
   2048 , 2177 , 2307 , 2435 , 2562  , 2687 , 2809 , 2928 , 3043 , 3155 ,
   3262 , 3364 , 3461 , 3552 , 3637 , 3716 , 3788 , 3853 , 3910 , 3961 ,
   4003 , 4038 , 4064 , 4083 , 4093 , 4095 , 4089 , 4075 , 4052 , 4021 ,
   3983 , 3936 , 3882 , 3821 , 3753 , 3677 , 3595 , 3507 , 3413 , 3313 ,
   3209 , 3100 , 2986 , 2869 , 2748 , 2624 , 2499 , 2371 , 2242 , 2112 ,
   1983 , 1853 , 1724 , 1596 , 1471 , 1347 , 1226 , 1109 , 995  , 886  ,
   782  , 682  , 588  , 500  , 418  , 342  , 274  , 213  , 159  , 112  ,
   74   , 43   , 20   , 6    , 0    , 2    , 12   , 31   , 57   , 92   ,
   134  , 185  , 242  , 307  , 379  , 458  , 543  , 634  , 731  , 833  ,
   940  , 1052 , 1167 , 1286 , 1408 , 1533 , 1660 , 1788 , 1918 , 2047 
};

static const unsigned int N_sawtooth_table = 100;
uint16_t sawtooth_table[N_sawtooth_table] = \
{
   0    , 41   , 82   , 124  , 165  , 206  , 248  , 289  , 330  , 372  ,
   413  , 455  , 496  , 537  , 579  , 620  , 661  , 703  , 744  , 786  ,
   827  , 868  , 910  , 951  , 992  , 1034 , 1075 , 1117 , 1158 , 1199 ,
   1241 , 1282 , 1323 , 1365 , 1406 , 1448 , 1489 , 1530 , 1572 , 1613 ,
   1654 , 1696 , 1737 , 1779 , 1820 , 1861 , 1903 , 1944 , 1985 , 2027 ,
   2068 , 2110 , 2151 , 2192 , 2234 , 2275 , 2316 , 2358 , 2399 , 2441 ,
   2482 , 2523 , 2565 , 2606 , 2647 , 2689 , 2730 , 2772 , 2813 , 2854 ,
   2896 , 2937 , 2978 , 3020 , 3061 , 3103 , 3144 , 3185 , 3227 , 3268 ,
   3309 , 3351 , 3392 , 3434 , 3475 , 3516 , 3558 , 3599 , 3640 , 3682 ,
   3723 , 3765 , 3806 , 3847 , 3889 , 3930 , 3971 , 4013 , 4054 , 0    
};

static const unsigned int N_triangle_table = 100;
uint16_t triangle_table[N_triangle_table] = \
{
   0    , 82   , 165  , 248  , 330  , 413  , 496  , 579  , 661  , 744  ,
   827  , 910  , 992  , 1075 , 1158 , 1241 , 1323 , 1406 , 1489 , 1572 ,
   1654 , 1737 , 1820 , 1903 , 1985 , 2068 , 2151 , 2234 , 2316 , 2399 ,
   2482 , 2565 , 2647 , 2730 , 2813 , 2896 , 2978 , 3061 , 3144 , 3227 ,
   3309 , 3392 , 3475 , 3558 , 3640 , 3723 , 3806 , 3889 , 3971 , 4054 ,
   4054 , 3971 , 3889 , 3806 , 3723 , 3640 , 3558 , 3475 , 3392 , 3309 ,
   3227 , 3144 , 3061 , 2978 , 2896 , 2813 , 2730 , 2647 , 2565 , 2482 ,
   2399 , 2316 , 2234 , 2151 , 2068 , 1985 , 1903 , 1820 , 1737 , 1654 ,
   1572 , 1489 , 1406 , 1323 , 1241 , 1158 , 1075 , 992  , 910  , 827  ,
   744  , 661  , 579  , 496  , 413  , 330  , 248  , 165  , 82   , 0    
};

uint32_t 						system_freq = 168*1000*1000;
TIM_HandleTypeDef* 	tim_trgo;

void wavegen_init()
{
	tim_trgo = &htim6;
	HAL_TIM_Base_Start(tim_trgo);
}

void wavegen_set_freq(float freq, int N)
{
	float psc = (system_freq*1.0f) / (N * freq);
	tim_trgo->Instance->PSC = (uint32_t)psc;
	tim_trgo->Instance->ARR = 1;
	HAL_TIM_Base_Start(tim_trgo);
}

void inline wavegen_start_sine()
{
	HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sine_table, N_sine_table, DAC_ALIGN_12B_R);
}

void inline wavegen_start_triangle()
{
	HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)triangle_table, N_triangle_table, DAC_ALIGN_12B_R);
}